import { reactive, ref } from 'vue';
import { cloneDeep, sum, isPlainObject } from 'lodash';
import Decimal from 'decimal.js';
import { IFormParams, ICreateOrEditParams, IRewardRow, IPoster, ITagItem } from './interface';
import {
    DEFAULT_RED_EXCHANGE_DESC,
    DEFAULT_EXCHANGE_DESC,
    DEFAULT_STAFFS_WELCOME,
    DEFAULT_GROUPCHAT_WELCOME,
    DEFAULT_SHARE_SETTING,
    ACTIVITY_LINK_WELCOME_SUFFIX,
    GROUP_COME_WELCOME_SUFFIX
} from './index';
/**
 * @description 步骤条的索引
 */
export const stepValue = ref(0);

/** 默认的form参数, 具体的参数的注释看interface文件 */
const defaultFormParams: IFormParams = {
    /** 步骤一
     * 基础信息字段
     */
    // 基础信息设置
    official_account_id: undefined, //公众号id
    activity_name: '',
    group_id: 0,
    period_type: 1, // 1: 永久 || 2: 固定期限
    activity_time: [], // YYYY-MM-DD HH:mm:ss
    description: '',
    activity_info_switch: 1, // 1:否， 2: 是
    activity_info_content: '', // (会包含、图片、音频、视频等信息)
    // 引流成员
    add_friends_switch: 1,
    user_list: [],
    helper_staff_divide: 1, // 1: 随机分配, 2: 溯源员工
    /** 步骤二
     * 奖品及群聊字段
     */
    // 奖品设置
    reward_type: 1, // 1: 阶梯奖励，2: 单一奖励
    reward_list: [
        {
            reward_type: 1, // 1: 实物， 2: 红包
            reward_title: '奖品一',
            reward_image: '//static.scrm.keyid.cn/assets/images/web-pc/default-liwu.png', // 是一段url
            reward_stock: 100, // int 类型
            help_num: 1, // int 类型
            // > 红包类型
            red_envelope_type: 1, // 1: 普通， 2: 拼手气
            red_envelope_money: 0.3, // float 类型,
            exchange_desc: '请确保获奖数据真实有效',
            // red_exchange_desc: undefined,
            // >> 拼手气红包
            red_envelope_total: 0, // float 类型
            red_envelope_money_min: 0.3, // 拼手气红包最小值
            red_envelope_range: 200, // 拼手气红包最大值
            //}
            // 兑换设置
            exchange_usage_type: 1, // 1: 兑换码, 2: 线下邮寄，
            exchange_code_type: 1, // 1: 系统自动生成, 2: 导入兑奖码，
            exchange_file_list: [],
            exchange_time: [],
            // >> 线下邮寄 时才有， 否则是 []
            mail_info: [],
            is_update: 1 //是否更新客户信息  1-关 2-开
        }
    ],
    reward_end_switch: 1, // 1:否， 2: 是
    inventory_show_switch: 1, // 1:否， 2: 是
    // 群聊设置
    groupchat_type: 1, // 1: 普通拉群， 2: 无限拉群
    // > 普通拉群时才有，否者是 []
    groupchat_list: [],
    groupchat: {
        groupchat_id: undefined, //群id
        name: '' //属性名称
    },
    join_groupchat_rank: 1, // 1: 按照顺序入群，2: 随机入群
    /** 步骤三
     * 分享设置
     */
    // 活动链接设置
    link_img: DEFAULT_SHARE_SETTING.link_img,
    link_title: DEFAULT_SHARE_SETTING.link_title,
    link_desc: DEFAULT_SHARE_SETTING.link_desc,
    // 欢迎语设置
    // 与之前的欢迎语结构一致, 只不过对应的welcome_material列表里的字段标识为:  is_default_link: boolean,
    staff_welcome: cloneDeep(DEFAULT_STAFFS_WELCOME),
    groupchat_welcome: cloneDeep(DEFAULT_GROUPCHAT_WELCOME),
    // 分享海报设置
    poster: {
        poster_type: 0, //0: 默认海报 1: 海报库， 2: 本地上传
        poster_id: undefined, //海报库中海报id
        absolute_url: 'https://static.scrm.keyid.cn/assets/images/web-pc/default-groupfission-poster.png', //海报图片url
        local_absolute_url: '',
        poster_absolute_url: '',
        avatar_flag: 1, //是否用户头像 1: 打开， 2: 关闭
        /** 头像展示类型 1: 圆形， 2: 方形 */
        avatar_type: 1,
        nickname_flag: 1, //是否用户昵称  1: 打开， 2: 关闭
        nickname_color: '#ffffff', //用户昵称颜色
        nickname_size: 14, //用户昵称字体大小
        desc_flag: 1, //是否描述 1: 打开， 2: 关闭
        desc_color: '#ffffff', //描述颜色
        desc_size: 12, //描述字体大小
        desc: '', //描述内容
        position: {
            avatarX: 1,
            avatarY: 1,
            nicknameX: 1,
            nicknameY: 1,
            qrcodeX: 1,
            qrcodeY: 1,
            descX: 1,
            descY: 1
        } //海报方位
    },
    /** 步骤四
     * 高级设置
     */
    // 高级设置
    help_lose_switch: 2, // 1: 关闭， 2: 开启
    release_method: 1, // 释放方式 1-领奖可释放 2-核销前可释放
    join_restrict_switch: 1, // 1: 关闭， 2: 开启
    gender_restrict: 1, // 1: 不限，2: 男， 3: 女
    area_restrict: 1, // 1: 不限，2: 可参与地区， 3: 不可参与地区
    area_list: [], // 区域的code
    win_prize_loop_switch: 2, // 1: 关闭， 2: 开启
    win_prize_loop_type: 1, // 1: 页面滚动 2: 滚动弹幕， 3: 轮播弹幕
    brush_switch: 1, // 1: 关闭， 2: 开启
    brush_set: {
        time: 60, //时间
        people: 10 //人数
    },
    inventory_reminder_switch: 1, // 1: 关闭， 2: 开启
    inventory_reminder_set: {
        num: 0, //奖品数量
        cycle: 1, //周期(1: 余量减1，2：时间间隔)
        time: 60 //间隔时间
    },
    auto_tag_switch: 1, // 1: 关闭， 2: 开启
    tag_rule: [
        {
            type: 1,
            assist_num: 1,
            tag_ids: []
        }
    ]
};

/**
 * @description 页面渲染表单所需的字段
 */
export const formParams = reactive<IFormParams>(cloneDeep(defaultFormParams));

/** 初始化 formParams */
export const initFormParams = () => {
    // 删除所有的属性，然后在进行深拷贝
    for (const key in formParams) {
        Reflect.deleteProperty(formParams, key);
    }
    Object.assign(formParams, cloneDeep(defaultFormParams));
    // 初始化步骤条的索引
    stepValue.value = 0;
};

/**
 * 根据formParams转化成后端所需要的字段
 * @returns create/edit 时传给后端的字段
 */
export const getParamsByFormModel = () => {
    const createParams: ICreateOrEditParams = cloneDeep(formParams);

    // 处理时间
    if (createParams.period_type === 1) {
        createParams.activity_time = [];
    }

    // 处理员工id
    createParams.user_list = formParams.user_list.map(item => item.id);

    // 处理奖品字段
    createParams.reward_list = formatRewardList(formParams.reward_list);

    // 处理群聊设置字段
    if (formParams.groupchat_type === 1) {
        // 普通拉群过滤掉群id，
        createParams.groupchat = undefined;
        createParams.groupchat_id = undefined;
    } else {
        // 无限拉群过滤群列表、id、入群顺序
        createParams.groupchat_list = [];
        createParams.groupchat_id = formParams.groupchat.groupchat_id;
        createParams.groupchat = undefined;
        createParams.join_groupchat_rank = 1;
    }

    // 过滤分享海报设置
    createParams.poster = formatPoster(formParams.poster);

    // 过滤高级设置，助力失效 （释放类型），暂定这个字段，等后端给了在改成正确的
    if (formParams.help_lose_switch === 1) {
        createParams.release_method = 1;
    }

    // 过滤参与限制
    if (formParams.join_restrict_switch === 1) {
        createParams.gender_restrict = 1;
        createParams.area_restrict = 1;
        createParams.area_list = [];
    }

    // 过滤群欢迎语的id, 多余的字段没必要给后端
    createParams.groupchat_welcome.welcome_friend_id = undefined;

    // 过滤中奖轮播
    if (formParams.win_prize_loop_switch === 1) {
        createParams.win_prize_loop_type = 1;
    }

    // 过滤放刷检测
    if (formParams.brush_switch === 1) {
        createParams.brush_set = {
            time: 60,
            people: 1
        };
    }

    // 过滤奖品余量提醒
    if (formParams.inventory_reminder_switch === 1) {
        // 关闭的情况下恢复默认值
        const rewardNumSum = sum(formParams.reward_list.map(item => item.reward_stock));
        const inventoryNum = Math.floor(Number(Decimal.mul(rewardNumSum, 0.05)));
        createParams.inventory_reminder_set = {
            num: inventoryNum < 1 ? 1 : inventoryNum, //奖品数量最小是1
            cycle: 1, //周期(1: 余量减1，2：时间间隔)
            time: 60 //间隔时间
        };
    } else if (formParams.inventory_reminder_set.cycle === 1) {
        // 打开的情况下看提醒周期如果是选择了【余量减少1】，则时间恢复默认值
        createParams.inventory_reminder_set.time = 60;
    }

    // 过滤自动打标签
    if (formParams.auto_tag_switch === 1) {
        createParams.tag_rule = [];
    } else {
        createParams.tag_rule = formatRulesList(formParams.tag_rule);
    }

    // 过滤详情里返回的缓存在表单数据中的欢迎语里的url。
    createParams[ACTIVITY_LINK_WELCOME_SUFFIX] = undefined;
    createParams[GROUP_COME_WELCOME_SUFFIX] = undefined;
    return createParams;
};

/**
 * 过滤奖品字段
 * @param rewardList
 * @returns 过滤好的可以传给后端的字段
 */
const formatRewardList = (rewardList: Array<IRewardRow>) => {
    return rewardList.map((rewardItem, index) => {
        const rewardRow: any = cloneDeep(rewardItem);
        rewardRow.step = index + 1; // 给后端用来做计算

        // 红包奖励把实物的字段改成默认值
        if (rewardItem.reward_type === 2) {
            // 把红包的描述改成对象须知的字段里。red_exchange_desc字段只是用来切换时的缓存展示
            rewardRow.exchange_desc = rewardItem.red_exchange_desc;

            // 红包计算总价
            if (rewardItem.red_envelope_type === 1) {
                // 普通红包计算总价
                rewardRow.red_envelope_total = Decimal.mul(rewardItem.reward_stock, rewardItem.red_envelope_money);
            } else {
                // 拼手气计算总价
                rewardRow.red_envelope_total = Decimal.mul(rewardItem.reward_stock, rewardItem.red_envelope_range);
            }

            // 其余一律改成默认值
            rewardRow.red_exchange_desc = undefined;
            rewardRow.exchange_usage_type = 1;
            rewardRow.exchange_code_type = 1;
            rewardRow.exchange_file_list = [];
            rewardRow.mail_info = [];
            rewardRow.is_update = 1;
            // 如果是红包，后续不做过滤了
            return rewardRow;
        }

        // 实物过滤红包相关的字段
        if (rewardItem.reward_type === 1) {
            rewardRow.red_envelope_type = 1;
            rewardRow.red_envelope_money = 0.3;
            rewardRow.red_exchange_desc = undefined;
            rewardRow.red_envelope_total = 0;
            rewardRow.red_envelope_range = 200;
        }

        // 兑奖码过滤线下邮寄字段
        if (rewardItem.exchange_usage_type === 1) {
            rewardRow.mail_info = [];
            rewardRow.is_update = 1;
        } else {
            // 邮寄字段过滤兑换码字段
            rewardRow.exchange_code_type = 1;
            rewardRow.exchange_file_list = [];
        }

        return rewardRow;
    });
};

/**
 * 过滤海报字段
 * @param poster 海报的配置
 * @returns 过滤完成可以给后端的的海报字段
 */
const formatPoster = (poster: IPoster) => {
    const posterParams = cloneDeep(poster);
    // 本地上传过滤掉海报库id
    if (poster.poster_type === 2) {
        posterParams.poster_id = undefined;
    }

    // 关闭头像时过滤头像的
    if (poster.avatar_flag === 2) {
        posterParams.avatar_type = 1;
    }

    // 关闭昵称时，过滤昵称的
    if (poster.nickname_flag === 2) {
        posterParams.nickname_color = '#ffffff';
        posterParams.nickname_size = 14;
    }

    // 关闭描述时，过滤描述的
    if (poster.desc_flag === 2) {
        posterParams.desc_color = '#ffffff';
        posterParams.desc_size = 14;
        posterParams.desc = '';
    }

    return posterParams;
};

/**
 * 过滤标签字段
 * @param rulesList 标签列表
 * @returns 过滤完成可以给后端的的海报字段
 */
const formatRulesList = (rulesList: Array<ITagItem>) => {
    return rulesList.map(item => {
        const tagItem: {
            type: number;
            assist_num: number;
            tag_ids: Array<number>;
        } = {
            type: item.type,
            assist_num: item.assist_num,
            tag_ids: item.tag_ids.map(item => item.id)
        };
        return tagItem;
    });
};

/**
 * 设置formParams的方法。由详情获取过来的做转换
 * @param data 接口返回的data
 */
export const setFormParams = (data: any) => {
    // 设置日期的
    if (data.period_type === 2) {
        data.activity_time = [data.begin_date || '', data.end_date || ''];
    }
    // 设置奖品列表的红包字段
    data.reward_list.forEach((rewardItem: IRewardRow) => {
        // 实物
        if (rewardItem.reward_type === 1) {
            rewardItem.red_exchange_desc = DEFAULT_RED_EXCHANGE_DESC;
        } else {
            rewardItem.red_exchange_desc = rewardItem.exchange_desc;
            rewardItem.exchange_desc = DEFAULT_EXCHANGE_DESC;
        }

        rewardItem.mail_info = rewardItem.mail_info || [];
        // 追加奖品数量默认为0
        rewardItem.add_stock = 0;
    });

    // 默认欢迎语做个截取操作, 这个操作放在前端操作，目的是为了顺便做个排序--start。
    // 设置欢迎语的是否是默认的字段，为了禁止删除
    const setDefaultWelcome = (item: any, suffix: string) => {
        // 非默认不处理
        if (item.is_default_del !== 1) {
            return;
        }

        // 截取活动分享链接标题
        if (item.link_title?.endsWith(suffix)) {
            data[suffix] = item.link_url; // 这里是为了改bug，回显时要把对应的link_url带上到欢迎语里。
            item.link_title = item.link_title.substring(0, item.link_title.length - suffix.length);
            return true;
        }
    };

    /** 根据默认的后缀最排序，同时处理是否是默认的字段 */
    const sortWelcomeByDefaultSuffix = (
        welcomeArray: Array<any>,
        suffix: string,
        selctFun: (item: any) => boolean | undefined = (item: any) => setDefaultWelcome(item, suffix)
    ) => {
        // 先查找两个标题，然后放到第一个
        const index = welcomeArray.findIndex(selctFun);
        if (index >= 0) {
            const [welcomeItem] = welcomeArray.splice(index, 1);
            welcomeArray.unshift(welcomeItem);
        }
    };

    if (isPlainObject(data.staff_welcome)) {
        [ACTIVITY_LINK_WELCOME_SUFFIX, GROUP_COME_WELCOME_SUFFIX].forEach(item =>
            // 查找对应的，然后放到第一个
            sortWelcomeByDefaultSuffix(data.staff_welcome.welcome_material, item)
        );
    }

    if (!isPlainObject(data.groupchat_welcome)) {
        data.groupchat_welcome = cloneDeep(DEFAULT_GROUPCHAT_WELCOME);
    }
    // 默认欢迎语做个截取操作, 这个操作放在前端操作，目的是为了顺便做个排序--end。

    // 标签默认给一条，不然打开后展示不友好
    if (!Array.isArray(data.tag_rule) || !data.tag_rule.length) {
        data.tag_rule = [
            {
                type: 1,
                assist_num: 1,
                tag_ids: []
            }
        ];
    }

    if (data.poster.poster_type == 1) {
        data.poster.poster_absolute_url = data.poster.absolute_url;
    } else if (data.poster.poster_type == 2) {
        data.poster.local_absolute_url = data.poster.absolute_url;
    }

    Object.assign(formParams, data);
};
